package com.dt.system.service.impl;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import com.dt.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dt.system.mapper.TaskMapper;
import com.dt.system.domain.Task;
import com.dt.system.service.ITaskService;

import static com.dt.common.utils.DateUtils.getNowDate;

/**
 * 任务Service业务层处理
 * 
 * @author yxg
 * @date 2024-01-26
 */
@Service
public class TaskServiceImpl implements ITaskService 
{
    @Autowired
    private TaskMapper taskMapper;

    /**
     * 查询任务
     * 
     * @param taskId 任务主键
     * @return 任务
     */
    @Override
    public Task selectTaskByTaskId(Long taskId)
    {
        return taskMapper.selectTaskByTaskId(taskId);
    }

    /**
     * 查询任务列表
     * 
     * @param task 任务
     * @return 任务
     */
    @Override
    public List<Task> selectTaskList(Task task)
    {
        return taskMapper.selectTaskList(task);
    }

    /**
     * 新增任务
     * 
     * @param task 任务
     * @return 结果
     */
    @Override
    public int insertTask(Task task)
    {
        task.setCreateTime(getNowDate());
        return taskMapper.insertTask(task);
    }

    /**
     * 修改任务
     * 
     * @param task 任务
     * @return 结果
     */
    @Override
    public int updateTask(Task task)
    {
        task.setUpdateTime(getNowDate());
        return taskMapper.updateTask(task);
    }

    /**
     * 批量删除任务
     * 
     * @param taskIds 需要删除的任务主键
     * @return 结果
     */
    @Override
    public int deleteTaskByTaskIds(Long[] taskIds)
    {
        return taskMapper.deleteTaskByTaskIds(taskIds);
    }

    /**
     * 删除任务信息
     * 
     * @param taskId 任务主键
     * @return 结果
     */
    @Override
    public int deleteTaskByTaskId(Long taskId)
    {
        return taskMapper.deleteTaskByTaskId(taskId);
    }


    //============================app接口========================================

    /**
     * 根据用户uid，查询用户待执行的列表
     * @param uid 用户id
     * @return  任务列表
     */
    @Override
    public List<Task> selectTaskListByExec(Long uid) {

        return taskMapper.selectTaskListByExec(uid);
    }


    /**
     *  根据登录用户的用户id查询发布任务列表
     *  查询所有未归档的数据
     *  查询条件：发布人等于id的记录
     *
     *   @param uid  发布人用户id
     *   @return 任务列表
     */
    public List<Task> selectTaskListByManage(Long uid){

        return taskMapper.selectTaskListByManage(uid);
    }

    /**
     * 获取未完成的提醒任务
     * @param uid 用户id
     * @return 任务列表
     *
     */
    public List<Task> selectRemindTaskListByUid(Long uid){

        //查询所有未完成的任务
        List<Task> tasks = taskMapper.selectRemindTaskListByUid(uid);

        //0提前2小时    1提前4小时   2提前6小时   3提前12小时     4提前24小时   5提前48小时)
        Long[] remind=new Long[]{2L,4L,6L,12L,24L,48L};

        //筛选需要提醒的任务（当期日期+提醒时间>=结束日期）
        List<Task> taskList = tasks.stream().filter(
                u -> getNowDate().getTime()+remind[Integer.parseInt(u.getTaskRemindType())]*3600000>= u.getTaskEndTime().getTime())
                .collect(Collectors.toList());

        //抽取所有提醒的任务ID
        List<Long> taskIds=taskList.stream().map(Task::getTaskId).collect(Collectors.toList());

        //批量修改提醒的任务的提醒次数
        if(!taskIds.isEmpty())
        {
            taskMapper.updateTaskRemind(taskIds);
        }


        return taskList;
    }

}
